home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample SMSAM / SampleSMSAM Source / BuildingBlocks / GMTTime.cp < prev    next >
Encoding:
Text File  |  1995-07-28  |  5.7 KB  |  247 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        GMTTime.cp
  3.  
  4.     Copyright:    © 1991-1994 by Apple Computer, Inc.
  5.                 All rights reserved.
  6.  
  7.     Part of the AOCE Sample SMSAM Package.  Consult the license
  8.     which came with this software for your specific legal rights.
  9.  
  10. */
  11.  
  12.  
  13.  
  14. #ifndef    __GMTTIME__
  15. #include "GMTTime.h"
  16. #endif
  17.  
  18. #ifndef    __OSUTILS__
  19. #include "OSUtils.h"
  20. #endif
  21.  
  22. #ifndef    __SCRIPT__
  23. #include "Script.h"
  24. #endif
  25.  
  26. #ifndef    __STRING__
  27. #include "String.h"
  28. #endif
  29.  
  30. #ifndef    __TIME_H__
  31. #include "Time.h"
  32. #endif
  33.  
  34. #ifndef __ABSTRACTFILE__
  35. #include "AbstractFile.h"
  36. #endif
  37.  
  38. #ifndef    __IOSTREAM__
  39. #include "IOStream.h"
  40. #endif
  41.  
  42. #pragma segment TimeStamp
  43.  
  44. /***********************************|****************************************/
  45. /***********************************|****************************************/
  46.  
  47. TTimeStamp::TTimeStamp ():
  48.     fOriginTime ( GetLocalTime () ),
  49.     fOriginZone ( GetLocalZone () )
  50. {
  51. }
  52.  
  53. /***********************************|****************************************/
  54.  
  55. TTimeStamp::~TTimeStamp ()
  56. {
  57. }
  58.  
  59. /***********************************|****************************************/
  60.  
  61. TTimeStamp::operator unsigned long () const
  62. {
  63.     return fOriginTime;
  64. }
  65.  
  66. /***********************************|****************************************/
  67.  
  68. Boolean
  69. TTimeStamp::operator == ( const TTimeStamp& that ) const
  70. {
  71.     return
  72.         ( fOriginTime + ( fOriginZone * 60 ) ) ==
  73.         ( that.fOriginTime + ( that.fOriginZone * 60 ) );
  74. }
  75.  
  76. /***********************************|****************************************/
  77.  
  78. TTimeStamp&
  79. TTimeStamp::operator = ( const TTimeStamp& that )
  80. {
  81.     fOriginTime = that.fOriginTime;
  82.     fOriginZone = that.fOriginZone;
  83.     return *this;
  84. }
  85.  
  86. /***********************************|****************************************/
  87.  
  88. Boolean
  89. TTimeStamp::operator != ( const TTimeStamp& that ) const
  90. {
  91.     return !operator == ( that );
  92. }
  93.  
  94. /***********************************|****************************************/
  95.  
  96. void
  97. TTimeStamp::SetToLocalTime ()
  98. {
  99.     fOriginZone = GetLocalZone ();
  100.     fOriginTime = GetLocalTime ();
  101. }
  102.  
  103. /***********************************|****************************************/
  104.  
  105. void
  106. TTimeStamp::ConvertToZone ( TimeZone newZone )
  107. {
  108.     fOriginTime += GetZoneDifference ( newZone, fOriginZone );
  109.     fOriginZone = newZone;
  110. }
  111.  
  112. /***********************************|****************************************/
  113.  
  114. Time
  115. TTimeStamp::GetLocalTime ()
  116. {
  117.     Time localTime;
  118.     ::GetDateTime ( &localTime );
  119.     return localTime;
  120. }
  121.  
  122. /***********************************|****************************************/
  123.  
  124. TimeZone
  125. TTimeStamp::GetLocalZone ()
  126. {
  127.     return GetLocalOffsetEastOfGMTInSeconds () / 60;
  128. }
  129.  
  130. /***********************************|****************************************/
  131.  
  132. Time
  133. TTimeStamp::GetZoneDifference ( const TimeZone local, const TimeZone reference )
  134. {
  135.     return 60 * (Time) ( local - reference );
  136. }
  137.  
  138. /***********************************|****************************************/
  139.  
  140. char*
  141. TTimeStamp::CreateString () const
  142. {
  143.     unsigned long length = GetStringLength ();
  144.     char* string = new char [ length + 1 ];
  145.     MakeString ( string, length );
  146.     return string;
  147. }
  148.  
  149. /***********************************|****************************************/
  150.  
  151. unsigned long
  152. TTimeStamp::GetStringLength () const
  153. {
  154.     return ::strlen ( ::ctime ( &( (TTimeStamp*) this )->fOriginTime ) ) + 1;
  155. }
  156.  
  157. /***********************************|****************************************/
  158.  
  159. void
  160. TTimeStamp::MakeString ( char* buffer, unsigned long bufferSize ) const
  161. {
  162.     ::strncpy ( buffer, ::ctime ( &( (TTimeStamp*) this )->fOriginTime ), (int) bufferSize );
  163.     buffer [ strlen ( buffer ) - 1 ] = 0;
  164. }
  165.  
  166. /***********************************|****************************************/
  167.  
  168. Boolean
  169. TTimeStamp::WriteTo ( TAbstractFile& file ) const
  170. {
  171.     if ( file.WriteDataIgnore ( &( (TTimeStamp*) this )->fOriginTime, sizeof ( fOriginTime ) ) != noErr )
  172.         return false;
  173.  
  174.     return file.WriteDataIgnore ( &( (TTimeStamp*) this )->fOriginZone, sizeof ( fOriginZone ) ) == noErr;
  175. }
  176.  
  177. /***********************************|****************************************/
  178.  
  179. Boolean
  180. TTimeStamp::ReadFrom ( TAbstractFile& file )
  181. {
  182.     if ( file.ReadDataIgnore ( &fOriginTime, sizeof ( fOriginTime ) ) != noErr )
  183.         return false;
  184.  
  185.     return file.ReadDataIgnore ( &fOriginZone, sizeof ( fOriginZone ) ) == noErr;
  186. }
  187.  
  188. /***********************************|****************************************/
  189.  
  190. ostream&
  191. TTimeStamp::operator >> ( ostream& file ) const
  192. {
  193.     file << "TTimeStamp:" << (void*) this << "\n";
  194.     file << "\tfOriginTime:" << fOriginTime << "\n";
  195.     file << "\tfOriginZone:" << fOriginZone << "\n";
  196.     file.flush ();
  197.     return file;
  198. }
  199.  
  200. /***********************************|****************************************/
  201.  
  202. unsigned long GetCurrentGMTSeconds ()
  203. {
  204.     unsigned long localSeconds;
  205.     GetDateTime ( &localSeconds );
  206.     return localSeconds - GetLocalOffsetEastOfGMTInSeconds ();
  207. }
  208.  
  209. /***********************************|****************************************/
  210.  
  211. unsigned long ConvertGMTSecondsToLocalSeconds ( unsigned long gmtSeconds )
  212. {
  213.     return gmtSeconds + GetLocalOffsetEastOfGMTInSeconds ();
  214. }
  215.  
  216. /***********************************|****************************************/
  217.  
  218. unsigned long ConvertLocalSecondsToGMTSeconds ( unsigned long localSeconds )
  219. {
  220.     return localSeconds + GetLocalOffsetEastOfGMTInSeconds ();
  221. }
  222.  
  223. /***********************************|****************************************/
  224.  
  225. long GetLocalOffsetEastOfGMTInSeconds ()
  226. {
  227.     static long gDelta = -1;    // impossible real value represents “uninitialized”
  228.  
  229.     if ( gDelta == -1 )
  230.     {
  231.         MachineLocation location;
  232.         ::ReadLocation ( &location );
  233.  
  234.         gDelta = 0x00FFFFFF & location.gmtFlags.gmtDelta;
  235.         
  236.         if ( gDelta & 0x00800000 )            // sign extend if negative
  237.             gDelta |= 0xFF000000;
  238.             
  239.         if ( location.gmtFlags.dlsDelta )    // adjust for daylight savings
  240.             gDelta -= 3600;
  241.     }
  242.     
  243.     return gDelta;
  244. }
  245.  
  246. /***********************************|****************************************/
  247.